package com.brillilab.common.utils;

import com.brillilab.common.constant.ResultEnum;
import com.brillilab.common.exceptions.BrillilabException;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 时间工具
 *
 * @author wmh
 */
public class TimeUtil {

    private TimeUtil() {
    }

    /**
     * 判断时间段是否重合
     *
     * @param starttime1
     * @param starttime2
     * @param endtime1
     * @param endtime2
     * @return
     */
    public static boolean isCoincidence(Date starttime1, Date starttime2, Date endtime1, Date endtime2) {
        if (starttime1.getTime() > endtime1.getTime() || starttime2.getTime() > endtime2.getTime())
            throw new BrillilabException(ResultEnum.TIME_FORMAT_ERROR);
        return starttime1.getTime() < starttime2.getTime() && endtime1.getTime() > starttime2.getTime()
                || starttime1.getTime() < endtime2.getTime() && endtime1.getTime() > endtime2.getTime()
                || starttime1.getTime() > starttime2.getTime() && starttime1.getTime() < endtime2.getTime()
                && endtime1.getTime() > starttime2.getTime() && endtime1.getTime() < endtime2.getTime()
                || starttime1.getTime() <= starttime2.getTime() && endtime1.getTime() >= endtime2.getTime();
    }

    /**
     * 判断时间点是否是时间段中
     *
     * @param timestamp
     * @param starttime
     * @param endtime
     * @return
     * @throws BrillilabException
     */
    public static boolean isCoincidence(Date timestamp, Date starttime, Date endtime) {
        if (timestamp.getTime() >= starttime.getTime() && timestamp.getTime() <= endtime.getTime()) {
            return true;
        }
        return false;
    }

    public static boolean isCoincidence(Integer start1, Integer end1, Integer start2, Integer end2) {
        if (start1 > end1 || start2 > end2)
            throw new BrillilabException(ResultEnum.TIME_FORMAT_ERROR);
        return (start1 <= start2 && end1 >= start2 && end1 <= end2)
                || (start1 >= start2 && start1 <= end2 && end1 >= end2)
                || (start1 >= start2 && end1 <= end2 && start1 <= end1);
    }

    /**
     * 返回完整具体的Date
     *
     * @param year
     * @param month
     * @param day
     * @param time
     * @return
     * @throws ParseException
     */
    public static Date getDirectDate(int year, int month, int day, String time) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            StringBuilder s = new StringBuilder().append(year).append("/").append(month).append("/").append(day).append(" ").append(time);
            return simpleDateFormat.parse(s.toString());
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static Date getDirectDateYear(int year, int month, int day, String time) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            String y = String.valueOf(year);
            String m = String.valueOf(month);
            String d = String.valueOf(day);
            if (m.length() == 1)
                m = "0" + m;
            if (d.length() == 1)
                d = "0" + d;
            StringBuilder s = new StringBuilder().append(y).append("/").append(m).append("/").append(d).append(" ").append(time);
            return simpleDateFormat.parse(s.toString());
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 返回两个时间天数差（自然日）
     *
     * @param startTime
     * @param endTime
     * @return
     */
    public static long getBetweenDays(long startTime, long endTime) {
        long days = (endTime - startTime) / (1000 * 60 * 60 * 24);
        return days;
    }

    /**
     * 返回两个时间天数差（不足一天按一天算）
     * @param startTime
     * @param endTime
     * @return
     */
    public static long getDiffDays(long startTime, long endTime) {
        long diff = (endTime - startTime);
        long left = (endTime - startTime) % (1000 * 60 * 60 * 24);
        long days = (endTime - startTime) / (1000 * 60 * 60 * 24);
        if (diff < 0) {
            return left < 0 ? days - 1 : days;
        } else {
            return left > 0 ? days + 1 : days;
        }
    }
}
